package org.javahispano.javacup.tacticas_aceptadas.LucasTG;

import java.util.ArrayList;
import java.util.List;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.Arquero;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.CentroDelantero;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.Enganche;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.Lateral;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.Punta;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.Saguero;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.Puesto.VolanteOfensivo;
import org.javahispano.javacup.tacticas_aceptadas.LucasTG.TacticaHuracanTA.TacticaHuracanTADetalle.JugadorImpl;

public class Estrategia {
	
	public boolean esEstrategiaSimple() {
		return false;
	}
	
	public boolean esEstrategiaDefensiva() {
		return false;
	}
	
	public boolean esEstrategiaBianchi() {
		return false;
	}
	
	private Posicion balonAnterior = new Posicion(0,0); 
	
	public Posicion getBalonAnterior() {
		return balonAnterior;
	}


	public void setBalonAnterior(Posicion balonAnterior) {
		this.balonAnterior = balonAnterior;
	}

	private int paseA;
	
    public int getPaseA() {
		return paseA;
	}


	public void setPaseA(int paseA) {
		this.paseA = paseA;
	}

	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		return null;
	}


	public boolean comparar(Estrategia elegirEstrategia){
		return true;
	}

	public boolean esEstrategiaOfensiva() {
		return false;
	}

	public boolean esEstrategiaDiosDeNueve() {
		return false;
	}

	public Posicion[] getPosiciones() {
		return null;
	}

 	
}
 class EstrategiaDefensiva extends Estrategia {

	public EstrategiaDefensiva(Jugador[] jugadores){
	    jugadores[0]= new Jugador(10,10);
	    jugadores[1]= new Jugador(10,10);
		jugadores[2]= new Jugador(10,10);    	
	    jugadores[3]= new Jugador(10,10);		
	    jugadores[4]= new Jugador(10,10);	
	    jugadores[5]= new Jugador(10,10);
	    jugadores[6]= new Jugador(10,10);  		
	    jugadores[7]= new Jugador(10,10);		
	    jugadores[8]= new Jugador(10,10);
	    jugadores[9]= new Jugador(10,10);		
	    jugadores[10]=new Jugador(10,10);
	}
	
	Posicion posiciones[]=new Posicion[]{
            new Posicion(0.0,-52.41044776119403),//Arquero 1
            new Posicion(-19.020979020979023,-27.6447963800905),//Saguero 2
            new Posicion(2.895104895104895,-31.07013574660634),//Saguero 3
            new Posicion(18.06993006993007,-28.656108597285066),//Saguero 4
            new Posicion(-8.797202797202797,-32.755656108597286), //Saguero 5
            new Posicion(-15.839160839160838,-25.800904977375566),//Saguero 6
            new Posicion(10.58741258741259,-25.28054298642534), //Saguero 7
            new Posicion(-3.041958041958042,-25.490950226244346), //Saguero 8
            new Posicion(-22.8531468531468533,33.257918552036195),//Lateral 9
            new Posicion(22.2595419847328244,27.067164179104477), //Lateral 10
            new Posicion(15.44055944055944,33.556561085972852) //CentroDelantero 11
        };

	
	public Posicion[] getPosiciones() {
		return posiciones;
	}


	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		List<Comando> comandos = new ArrayList<Comando>();
	    switch (id_Jugador) {
           case 0:
        	   comandos = Arquero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 1:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 2:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 3:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 4:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 5:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 6:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 7:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 8:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 9:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 10:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
       }

		return comandos;
	}

	
	public boolean comparar(Estrategia elegirEstrategia) {
		return esEstrategiaSimple();
	}


	public boolean esEstrategiaDefensiva() {
		return true;
	}
}

 class EstrategiaSimple extends Estrategia {


	public EstrategiaSimple(Jugador[] jugadores){
	    jugadores[0]= new Jugador(5,5);
	    jugadores[1]= new Jugador(5,5);
		jugadores[2]= new Jugador(5,5);	    	
	    jugadores[3]= new Jugador(5,5);		
	    jugadores[4]= new Jugador(5,5); 		
	    jugadores[5]= new Jugador(9,8);
	    jugadores[6]= new Jugador(8,10);  		
	    jugadores[7]= new Jugador(10,8);		
	    jugadores[8]= new Jugador(10,10);
	    jugadores[9]= new Jugador(8,10);		
	    jugadores[10]=new Jugador(8,8);
	}
	
	 

	Posicion posiciones[]=new Posicion[]{
            new Posicion(0.0,-52.41044776119403),//Arquero 1
            new Posicion(-19.020979020979023,-27.6447963800905),//Lateral 2
            new Posicion(6.895104895104895,-31.07013574660634),//Saguero 3
            new Posicion(18.06993006993007,-28.656108597285066),//Lateral 4
            new Posicion(-8.797202797202797,-32.755656108597286), //Saguero 5
            new Posicion(-6.839160839160838,-3.800904977375566),//VolanteOfensivo 6
            new Posicion(-22.58741258741259,23.28054298642534), //Punta 7
            new Posicion(22.041958041958042,23.490950226244346), //Punta 8
            new Posicion(-10.8531468531468533,33.257918552036195),//CentroDelantero 9
            new Posicion(-0.2595419847328244,17.067164179104477), //Enganche 10
            new Posicion(15.44055944055944,33.556561085972852) //CentroDelantero 11
        };

	
	public Posicion[] getPosiciones() {
		return posiciones;
	}


	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		List<Comando> comandos = new ArrayList<Comando>();
	    switch (id_Jugador) {
           case 0:
        	   comandos = Arquero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 1:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 2:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 3:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 4:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 5:
        	   comandos = VolanteOfensivo.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 6:
        	   comandos = Punta.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 7:
        	   comandos = Punta.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 8:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 9:
        	   comandos = Enganche.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 10:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
       }

		return comandos;
	}


	public boolean comparar(Estrategia elegirEstrategia) {
		return elegirEstrategia.esEstrategiaSimple();
	}


	public boolean esEstrategiaSimple() {
		return true;
	}
	
	
}
 class EstrategicaBianchi extends Estrategia {
	
	
	public EstrategicaBianchi(Jugador[] jugadores){
	    jugadores[0]= new Jugador(9,8);
	    jugadores[1]= new Jugador(9,8);
		jugadores[2]= new Jugador(9,8);	    	
	    jugadores[3]= new Jugador(8,9);		
	    jugadores[4]= new Jugador(8,9); 		
	    jugadores[5]= new Jugador(9,8);
	    jugadores[6]= new Jugador(9,10);  		
	    jugadores[7]= new Jugador(10,9);		
	    jugadores[8]= new Jugador(10,10);
	    jugadores[9]= new Jugador(10,10);		
	    jugadores[10]=new Jugador(8,8);
	    
	}
	
	Posicion posiciones[]=new Posicion[]{
            new Posicion(0.0,-52.41044776119403),//Arquero 1
            new Posicion(-19.020979020979023,-35.6447963800905),//Saguero 2
            new Posicion(6.895104895104895,-34.07013574660634),//Saguero 3
            new Posicion(18.06993006993007,-35.656108597285066),//Saguero 4
            new Posicion(-8.797202797202797,-27.755656108597286), //Saguero 5
            new Posicion(10.839160839160838,-27.800904977375566),//Saguero 6
            new Posicion(-22.58741258741259,23.28054298642534), //VolanteOfensivo 7
            new Posicion(22.041958041958042,23.490950226244346), //VolanteOfensivo 8
            new Posicion(-10.8531468531468533,33.257918552036195),//CentroDelantero 9
            new Posicion(-0.2595419847328244,33.067164179104477), //CentroDelantero 10
            new Posicion(15.44055944055944,33.556561085972852) //CentroDelantero 11
        };

	
	public Posicion[] getPosiciones() {
		return posiciones;
	}


	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		List<Comando> comandos = new ArrayList<Comando>();
	    switch (id_Jugador) {
           case 0:
        	   comandos = Arquero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 1:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 2:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 3:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 4:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 5:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 6:
        	   comandos = Punta.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 7:
        	   comandos = Punta.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 8:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 9:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 10:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
       }

		return comandos;
	}

	
	public boolean comparar(Estrategia elegirEstrategia) {
		return elegirEstrategia.esEstrategiaBianchi();
	}


	public boolean esEstrategiaBianchi() {
		return true;
	}
}

 class EstrategicaDiosDeNueve extends Estrategia {


	public EstrategicaDiosDeNueve(Jugador[] jugadores){
	    jugadores[0]= new Jugador(8,10);
	    jugadores[1]= new Jugador(8,10);
		jugadores[2]= new Jugador(8,10);	    	
	    jugadores[3]= new Jugador(8,10);		
	    jugadores[4]= new Jugador(10,8); 		
	    jugadores[5]= new Jugador(10,8);
	    jugadores[6]= new Jugador(8,10);  		
	    jugadores[7]= new Jugador(10,8);		
	    jugadores[8]= new Jugador(10,8);
	    jugadores[9]= new Jugador(10,10);		
	    jugadores[10]=new Jugador(8,8);
	}
	Posicion posiciones[]=new Posicion[]{
            new Posicion(0.0,-52.41044776119403),//Arquero 1
            new Posicion(-19.020979020979023,-27.6447963800905),//Lateral 2
            new Posicion(6.895104895104895,-31.07013574660634),//Saguero 3
            new Posicion(18.06993006993007,-28.656108597285066),//Lateral 4
            new Posicion(-8.797202797202797,-32.755656108597286), //Saguero 5
            new Posicion(-6.839160839160838,-25.800904977375566),//Lateral 6
            new Posicion(-22.58741258741259,-19.28054298642534), //Saguero 7
            new Posicion(22.041958041958042,-17.490950226244346), //Lateral 8
            new Posicion(-10.8531468531468533,-33.257918552036195),//Saguero 9
            new Posicion(-0.2595419847328244,19.067164179104477), //Enganche 10
            new Posicion(-19.44055944055944,42.556561085972852) //CentroDelantero 11
        };

	
	public Posicion[] getPosiciones() {
		return posiciones;
	}


	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		List<Comando> comandos = new ArrayList<Comando>();
	    switch (id_Jugador) {
           case 0:
        	   comandos = Arquero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 1:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 2:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 3:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 4:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 5:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 6:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 7:
        	   comandos = Lateral.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 8:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 9:
        	   comandos = Enganche.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 10:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
       }

		return comandos;
	}

	
	public boolean comparar(Estrategia elegirEstrategia) {
		return elegirEstrategia.esEstrategiaDiosDeNueve();
	}


	public boolean esEstrategiaDiosDeNueve() {
		return true;
	}	
	
}

 class EstrategicaOfensiva extends Estrategia {

	
	public EstrategicaOfensiva(Jugador[] jugadores){
	    jugadores[0]= new Jugador(5,5);
	    jugadores[1]= new Jugador(5,5);
		jugadores[2]= new Jugador(5,5);	    	
	    jugadores[3]= new Jugador(8,10);		
	    jugadores[4]= new Jugador(8,10); 		
	    jugadores[5]= new Jugador(10,8);
	    jugadores[6]= new Jugador(8,10);  		
	    jugadores[7]= new Jugador(10,8);		
	    jugadores[8]= new Jugador(10,9);
	    jugadores[9]= new Jugador(8,10);		
	    jugadores[10]=new Jugador(9,9);
	}
	
	
	Posicion posiciones[]=new Posicion[]{
            new Posicion(0.0,-52.41044776119403),//Arquero 1
            new Posicion(-10.020979020979023,-34.6447963800905),//Saguero 2
            new Posicion(6.895104895104895,-30.07013574660634),//Saguero 3
            new Posicion(18.06993006993007,-2.656108597285066),//VolanteOfensivo 4
            new Posicion(-8.797202797202797,-3.755656108597286), //VolanteOfensivo 5
            new Posicion(-26.839160839160838,23.800904977375566),//CentroDelantero 6
            new Posicion(-22.58741258741259,18.28054298642534), //Enganche 7
            new Posicion(22.041958041958042,33.490950226244346), //CentroDelantero 8
            new Posicion(-10.8531468531468533,33.257918552036195),//CentroDelantero 9
            new Posicion(-0.2595419847328244,18.067164179104477), //Enganche 10
            new Posicion(-27.44055944055944,33.556561085972852) //CentroDelantero 11
        };

	
	public Posicion[] getPosiciones() {
		return posiciones;
	}


	public List<Comando> generarComandos(SituacionPartido sp, int id_Jugador, Jugador[] jugadores) {
		List<Comando> comandos = new ArrayList<Comando>();
	    switch (id_Jugador) {
           case 0:
        	   comandos = Arquero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 1:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 2:
        	   comandos = Saguero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 3:
        	   comandos = VolanteOfensivo.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 4:
        	   comandos = VolanteOfensivo.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 5:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 6:
        	   comandos = Enganche.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 7:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 8:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 9:
        	   comandos = Enganche.generarComandos(this,sp,id_Jugador,jugadores);
               break;
           case 10:
        	   comandos = CentroDelantero.generarComandos(this,sp,id_Jugador,jugadores);
               break;
       }

		return comandos;
	}

	
	public boolean comparar(Estrategia elegirEstrategia) {
		return elegirEstrategia.esEstrategiaOfensiva();
	}


	public boolean esEstrategiaOfensiva() {
		return true;
	}	
}
 
 class Jugador {

		public Jugador(int PaseA,int PaseB){
			this.setPasarAJugador(PaseA);
			this.setPasarAJugadorSuplente(PaseB);
		}
		private JugadorImpl jugadorDetalle;

		private int nroJugador;
		private int pasarAJugador;
		private int pasarAJugadorSuplente;
		
		public int getPasarAJugador() {
			return pasarAJugador;
		}

		public void setPasarAJugadorSuplente(int pasarAJugador) {
			this.pasarAJugadorSuplente = pasarAJugador;
		}
		
		public int getPasarAJugadorSuplente() {
			return pasarAJugadorSuplente;
		}

		public void setPasarAJugador(int pasarAJugador) {
			this.pasarAJugador = pasarAJugador;
		}

		public int getNroJugador() {
			return nroJugador;
		}

		public void setNroJugador(int nroJugador) {
			this.nroJugador = nroJugador;
		}

		public JugadorImpl getJugadorDetalle() {
			return jugadorDetalle;
		}

		public void setJugadorDetalle(JugadorImpl jugadorDetalle) {
			this.jugadorDetalle = jugadorDetalle;
		}
		
	}
